#ifndef WIN_TCP_SOCKET_HPP
#define WIN_TCP_SOCKET_HPP
#include "env.h"
#include <cstdio>

#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

// 封装一下socket
class winTCPSocket {
  public:
    winTCPSocket();
    ~winTCPSocket();
    // int ServeSend(const char *buffer, int length);
    // int ServeResv(char *buffer, int length);
    int Resv(char *buffer, int length);
    int Send(const char *buffer, int length);
    int Connect();
    int Close();
    // int Bind();
    // int Listen();
    // int Accept();
    // int ServeShutdown();
  private:
    SOCKET servSock; // 用于发送连接申请, 接受文件 端口随机生成
    SOCKET clntSock; // 用于接受连接申请, 发送文件 端口25525
    SOCKET resvSock; // 接受连接后，发送文件时生成的sock
    sockaddr_in servAddr; // 发送连接请求中将要通信的服务器的地址
    sockaddr_in clntAddr; // 接收连接请求中本机的地址
    sockaddr_in resvAddr; // 接收连接请求中对方的地址
    int addrLen = sizeof(sockaddr_in);
};

winTCPSocket::winTCPSocket() {
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2, 2), &wsaData);
  servSock = socket(PF_INET, SOCK_STREAM, 0); // tcp servSock
  
  memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充
  servAddr.sin_family = PF_INET; // IPv4 地址
  servAddr.sin_addr.s_addr = inet_addr(SERVER_IP); // IPv4 地址
  servAddr.sin_port = htons(SERVER_PORT); // 端口
}
winTCPSocket::~winTCPSocket() {
  Close();
}
int winTCPSocket::Close() {
  closesocket(clntSock);
  closesocket(resvSock);
  closesocket(servSock);
  WSACleanup();
  system("pause");
  return 1;
}

// int winTCPSocket::Bind() {
//   memset(&clntAddr, 0, sizeof(clntAddr));
//   clntAddr.sin_family = PF_INET;
//   clntAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//   clntAddr.sin_port = htons(CLIENT_PORT);
//   bind(clntSock, (SOCKADDR*)&clntAddr, sizeof(clntAddr));
//   Listen();
//   Accept();
//   return 1;
// }

// int winTCPSocket::Listen() {
//   listen(clntSock, 20);
//   return 1;
// }

// int winTCPSocket::Accept() {
//   resvSock = accept(clntSock, (SOCKADDR*)&resvAddr, &addrLen);
//   return 1;
// }

// int winTCPSocket::ServeSend(const char *buffer, int length) {
//   send(resvSock, buffer, length, 0);
//   return 1;
// }

// int winTCPSocket::ServeResv(char *buffer, int length) {
//   int strLen = recv(resvSock, buffer, length, 0);
//   return strLen;
// }

int winTCPSocket::Resv(char *buffer, int length) {
  int strLen = recv(servSock, buffer, length, 0);
  return strLen;
}

int winTCPSocket::Send(const char *buffer, int length) {
  send(servSock, buffer, length, 0);
  return 1;
}

int winTCPSocket::Connect() {
  connect(servSock, (SOCKADDR*)&servAddr, sizeof(servAddr));
  return 1;
}

// int winTCPSocket::ServeShutdown() {
//   shutdown(servSock, SD_SEND);
//   return 1;
// }

#endif // WIN_TCP_SOCKET_HPP